package strUtil

import (
	"context"
	"fmt"
	"github.com/gogf/gf/v2/os/glog"
	"math/rand"
	"regexp"
	"strings"
	"time"
)

func PrintByteArray(data []byte) {
	res, _ := fmt.Printf("%02x \n", data)
	glog.Line().Info(context.Background(), res)
}

// 没有数字的随机
func RandomStr(length int) string {
	str := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
	bytes := []byte(str)
	var result []byte
	rand.Seed(time.Now().UnixNano() + int64(rand.Intn(100)))
	for i := 0; i < length; i++ {
		result = append(result, bytes[rand.Intn(len(bytes))])
	}
	return string(result)
}

func RandomStr2(length int) string {
	str := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
	bytes := []byte(str)
	var result []byte
	rand.Seed(time.Now().UnixNano() + int64(rand.Intn(100)))
	for i := 0; i < length; i++ {
		result = append(result, bytes[rand.Intn(len(bytes))])
	}
	return string(result)
}

func StrPadLeft(originalString string, targetLength int, zeroString string) string {
	// 计算需要补充的零字符数量
	zerosToAdd := targetLength - len(originalString)
	if zerosToAdd > 0 {
		zeroString = strings.Repeat(zeroString, zerosToAdd)
		// 合并原始字符串和零字符字符串
		finalString := zeroString + originalString
		return finalString
	} else {
		return originalString
	}
}

// ValidateStringKey 判断字符串是否符合规定的规则  少于n位 只能包含 字母数字下划线  开头必须是字母  下划线只能在中间
func ValidateStringKey(s string, N int) bool {
	// 字符串长度必须大于1位
	if len(s) <= 1 {
		return false
	}
	// 字符串长度必须小于 N
	if len(s) >= N {
		return false
	}

	// 检查字符串是否符合字母开头、只包含字母、数字和下划线的规则
	match, err := regexp.MatchString("^[a-zA-Z][a-zA-Z0-9_]*$", s)
	if err != nil || !match {
		return false
	}

	// 检查下划线只能出现在中间
	if strings.HasPrefix(s, "_") || strings.HasSuffix(s, "_") {
		return false
	}

	// 检查下划线不能连续出现
	if strings.Contains(s, "__") {
		return false
	}

	return true
}
